{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 15\n",
    "\n",
    "# 函数极限\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37e36360-19e1-435f-b47f-16efcaa73d2c",
   "metadata": {},
   "source": [
    "这段代码使用表达式 $f(x) = \\left(1 + \\frac{1}{x}\\right)^x$ 来近似数学常数 $e$，并通过数值计算和图像展示，分析其在 $x \\to \\infty$ 时的收敛行为。具体而言，代码定义了 $f(x)$ 这一逼近公式的表达式，然后计算其在$x$从$0.1$到$1000$之间的数值。函数 $f(x)$ 的行为基于极限：\n",
    "\n",
    "$$\n",
    "\\lim_{x \\to \\infty} \\left(1 + \\frac{1}{x}\\right)^x = e\n",
    "$$\n",
    "\n",
    "其中，$e$是自然常数，近似值为$2.71828$。代码通过符号计算库 SymPy 的 `limit` 函数，计算 $f(x)$ 在 $x \\to \\infty$ 时的极限值，结果应为$e$。接着，代码创建一个数值数组$x$，在每个$x$值上计算$f(x)$，将其结果存储为数组，用于后续的绘图。\n",
    "\n",
    "代码使用`Matplotlib`绘制$f(x)$随$x$变化的曲线。通过对数刻度的横轴，观察 $f(x)$ 随着$x$增大逐步趋近于$e$。图中添加了红色水平线，表示极限值 $e$，以便清晰地看到 $f(x)$ 的逼近效果。通过此图，可以直观地看到，随着$x$的增大，$f(x)$曲线逐渐趋于稳定，与$e$的值越来越接近，表明表达式确实可以作为$e$的逼近公式。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5f21970-2d6d-41fc-a964-4b20feecd122",
   "metadata": {},
   "source": [
    "## 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3e250316-2950-4dc1-b154-cfac107f1c7e",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sympy import latex, lambdify, limit, log, oo  # 导入符号计算库SymPy中的latex格式化、数值化、极限、对数和无穷大符号\n",
    "from sympy.abc import x  # 导入符号变量x\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt  # 导入NumPy和Matplotlib用于数值计算和绘图"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4496ae95-a5d0-4e1e-bff5-67b3d27b05b0",
   "metadata": {},
   "source": [
    "## 定义函数 f(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5c74c6ed-5622-4a6d-8022-d40c59b64550",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\left(1 + \\frac{1}{x}\\right)^{x}$"
      ],
      "text/plain": [
       "(1 + 1/x)**x"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f_x = (1 + 1/x)**x  # 定义指数表达式，近似e的计算公式\n",
    "f_x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c77918c-faae-463d-840d-fc0fd2a58d43",
   "metadata": {},
   "source": [
    "## 创建x的值域"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "44b51d1e-8e0d-48ec-bf39-b5ca9ed5ac74",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_array = np.linspace(0.1, 1000, 1000)  # 定义x的数组，从0.1到1000，生成1000个值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b11488a-518f-410f-b625-e10d23a0c1af",
   "metadata": {},
   "source": [
    "## 将符号表达式转换为数值函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c61aa869-c2c3-4b9e-a4fd-b6191141754b",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_x_fcn = lambdify(x, f_x)  # 将f(x)转换为Python数值函数\n",
    "f_x_array = f_x_fcn(x_array)  # 计算每个x对应的f(x)值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91c5ca93-92be-4540-bb4a-4a78c11002cd",
   "metadata": {},
   "source": [
    "## 计算x趋于无穷大时f(x)的极限"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5f9431ff-ee6c-45a8-b1fe-38a2f1633788",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$\\displaystyle e$"
      ],
      "text/plain": [
       "E"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f_x_oo_limit = limit(f_x, x, oo)  # 计算f(x)在x趋向于无穷时的极限\n",
    "f_x_oo_limit"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aef44d27-8174-4ac8-8adf-42ffd1bcce5d",
   "metadata": {},
   "source": [
    "## 可视化结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3b86fd71-f0ea-470b-b5a8-d4b352455de5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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uaElwofqM//r1q0zxowZU9M2ZcoUY968eT6vFQ3XkM87n+emp77zXVFRYQwZMsSYO3duY5QJL/HGz/P77rvPeP/99z1+zYA/wlSbyspKbd68WcOHDz/j+eHDh+urr74yqSo0Fk/mf9CgQdq+fbuOHTum4uJirVixQtdcc40Z5aKB+Lw3L57Mt2EYuvPOO3XFFVfo9ttvN6NMeIkn852Tk6OioiJJUlFRkdLT03XhhRd6/BpB3iu36Tl58qSqqqqUlJR0xvNJSUk6ceKEx/u55pprtGXLFpWWlqpdu3ZaunSpBg4c6O1y4WWezH9QUJCeffZZDRs2TC6XSw8++KDH36iAf/H0887nOTB4Mt/r1q3TwoUL1adPn5rrYd555x317t27sctFA3ky30ePHtU999wjwzBkGIYmTZqkPn36ePwazTow/eCn16QYhlGn61T41lTT5m7+r7/+el1//fWNXRZ8xN1883kOLLXN9+DBg+VyucwoCz5S23z3799fmZmZ9d53sz4l16pVK9lstrOOJuXm5p6VUhF4mP/mhfluXpjv5qUx5rtZB6aQkBD1799fq1atOuP5VatW6ZJLLjGpKjQW5r95Yb6bF+a7eWmM+Q74U3IlJSXat29fzfbBgweVmZmp+Ph4tW/fXlOnTtXtt9+uAQMG6OKLL9brr7+urKws3XfffSZWDW9h/psX5rt5Yb6bF9Pn2+Pv0zVRq1evNiSd9bjjjjtq+rz88stGhw4djJCQEOOiiy4y1qxZY17B8Crmv3lhvpsX5rt5MXu+WUsOAADAjWZ9DRMAAIAnCEwAAABuEJgAAADcIDABAAC4QWACAABwg8AEAADgBoEJAADADQITAACAGwQmAAAANwhMAAAAbhCYAAAA3CAwAWgWFixYoLCwMB07dqzmuXvvvVd9+vRRYWGhiZUBaApYfBdAs2AYhvr166chQ4bopZde0owZM/TPf/5T69evV9u2bc0uD4CfCzK7AABoDBaLRX/+8581duxYtWnTRi+88IK+/PJLwhIAj3CECUCzctFFF2nHjh367LPPdPnll5tdDoAmgmuYADQbn376qb777jtVVVUpKSnJ7HIANCEcYQLQLGzZskVDhw7Vyy+/rPfee08RERFatGiR2WUBaCK4hglAwDt06JBGjRqlhx9+WLfffrt69OihgQMHavPmzerfv7/Z5QFoAjjCBCCgFRQU6NJLL9Vll12m1157reb5G264QXa7XStXrjSxOgBNBYEJAADADS76BgAAcIPABAAA4AaBCQAAwA0CEwAAgBsEJgAAADcITAAAAG4QmAAAANwgMAEAALhBYAIAAHCDwAQAAOAGgQkAAMANAhMAAIAb/x88/un6gSaeuQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()  # 创建绘图窗口\n",
    "\n",
    "ax.plot(x_array, f_x_array, linewidth=1.5)  # 绘制f(x)的曲线\n",
    "ax.axhline(y=f_x_oo_limit, color='r')  # 添加水平线表示极限值\n",
    "\n",
    "ax.grid(linestyle='--', linewidth=0.25, color=[0.5, 0.5, 0.5])  # 添加网格线\n",
    "ax.set_xlim(x_array.min(), x_array.max())  # 设置x轴范围\n",
    "plt.xscale(\"log\")  # 设置x轴为对数尺度\n",
    "ax.set_xlabel(r'$\\it{x}$', fontname='Times New Roman')  # 设置x轴标签\n",
    "ax.set_ylabel(r'$%s$' % latex(f_x), fontname='Times New Roman')  # 使用LaTeX格式化y轴标签为f(x)的表达式\n",
    "\n",
    "plt.grid(True, which=\"both\", ls=\"-\")  # 添加网格线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
